package algo_annotations.trt;

import algo_annotations.data.Data_a;
import algo_annotations.heuristique.AlgoGenetic;
import algo_annotations.heuristique.TraitementSousGroupe;
import algo_annotations.params.Params_a;
import commons.logs.Logger;
import commons.utils.UtilsCalcul;
import commons.utils.UtilsTime;
import java.awt.Color;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class DialogTraitementAnno extends javax.swing.JDialog {

	private Data_a data;
	private Params_a params;
	private boolean bStopCalcul;

	private Worker worker_pass1;
	private Worker worker_pass2;

	DialogDetailsTraitement dlg_DetailTraitement;

	public DialogTraitementAnno(Data_a data) {
		initComponents();

		this.data = data;
		this.params = data.params;

		dlg_DetailTraitement = new DialogDetailsTraitement();
		dlg_DetailTraitement.setModal(false);
		adjustPositionOfDlgDetail();

		startCalcul();
	}

	// positionne la dlg de detail sous this
	private void adjustPositionOfDlgDetail() {
		dlg_DetailTraitement.setLocation(this.getLocation().x, this.getLocation().y + this.getHeight());
		dlg_DetailTraitement.setSize(this.getWidth(), dlg_DetailTraitement.getHeight());
	}

	private void startCalcul() {
		bStopCalcul = false;

		data.algo = new AlgoGenetic(data);
		data.algo.initAlgo();

		//****** 1ere PASSE ****************************************************
		// Le groupe de site a deja les sous-groupe de la 1ere passe pré-calculés lors des pre-traitements
		// On peut donc demander à l'algo de creer les traitements correspondants
		data.algo.createTraitements_pass1();
		
		worker_pass1 = new Worker(1, data.algo.vAllTrt_pass1);
		worker_pass1.start();
	}

	private void startPass2() {
		//****** 2eme PASSE ****************************************************

		DialogConfigPasse2 dlg_pass2 = null;
		if (params.bModeInteractif_pass2) {
			dlg_pass2 = new DialogConfigPasse2(data, params, worker_pass1.vitesse);
			dlg_pass2.setModal(true);

			// positionnement au centre de this
			int x_centerThis = this.getLocation().x + this.getWidth()/2;
			int y_centerThis = this.getLocation().y + this.getHeight()/2;
			int x_newLocation = x_centerThis - dlg_pass2.getWidth()/2;
			int y_newLocation = y_centerThis - dlg_pass2.getHeight()/2;
			// Essayons de ne pas sortir de l'écran ...
			if (x_newLocation<0) x_newLocation = 0;
			if (y_newLocation<0) y_newLocation = 0;

			dlg_pass2.setLocation(x_newLocation, y_newLocation);

			dlg_pass2.setVisible(true);
		}
		// si on n'est pas en mode interactif, les bonnes valeurs de paramètres sont déjà dans le params
		//  issue de la DLG de paramétrage initiale
		
		if (!params.bModeInteractif_pass2 || dlg_pass2.bLancePasse2) {

			//on grise les Component correspondant à la pass1
			label_Nom_pass1.setEnabled(false);
			pb_TraitementComplet_pass1.setEnabled(false);
			label_Note_pass1.setEnabled(false);
			tf_Note_pass1.setEnabled(false);
			tf_Note_pass1.setBorder(javax.swing.BorderFactory.createLineBorder(Color.GRAY));
			label_dureeRestante_pass1.setEnabled(false);
			tf_dureeRestante_pass1.setEnabled(false);

			// on degrise les Component correspondant à la pass2
			label_Nom_pass2.setEnabled(true);
			pb_TraitementComplet_pass2.setEnabled(true);
			label_Note_pass2.setEnabled(true);
			tf_Note_pass2.setEnabled(true);
			tf_Note_pass2.setBorder(javax.swing.BorderFactory.createLineBorder(Color.BLACK));
			label_dureeRestante_pass2.setEnabled(true);
			tf_dureeRestante_pass2.setEnabled(true);


			// Creation des traitements de la 2eme passe
			data.grpSite.prepareTraitement_pass2(data.algo.getBestGroupeAnno(), params.algo_seuilNote_pass2, params.algo_seuilInteraction_pass2);
			data.algo.createTraitements_pass2(params.algo_tailleVivier_pass2, params.algo_nbIter_pass2);

			// Lancement du thread de calcul
			worker_pass2 = new Worker(2, data.algo.vAllTrt_pass2);
			worker_pass2.start();

		} else {
			finalizeTraitement();
		}
		
		if (dlg_pass2!=null)
			dlg_pass2.dispose();
	}


	// maj l'IHM de la DLG en fin de traitement
	private void finalizeTraitement() {
		button_Exit.setText("Fermer la fenêtre");
		bStopCalcul = true;
	}


	private class Worker extends Thread {
		private int numPass;
		private ArrayList<TraitementSousGroupe> vTrt;

		private long timeDeb;

		private double nbCalculsElementairesTotal_pondere=0;
		private double nbCalculsElementairesRealise=0;

		// vitesse de calcul calculée en fin de traitement : celle obtenue en passe1 va etre
		//  utilisée pour estimer la durée de la passe 2 en mode interactif
		public double vitesse;

		public Worker(int numPass, ArrayList<TraitementSousGroupe> vTrt) {
			this.numPass = numPass;
			this.vTrt = vTrt;
		}

		@Override
		public void run() {

			try {
			// calcul du nombre total de traitements elementaires (pour le progress bar global)
			for (TraitementSousGroupe trt : vTrt)
				nbCalculsElementairesTotal_pondere += trt.getNbCalculsElementaires_Total_pondere();

			timeDeb = System.currentTimeMillis();
			UtilsTime.startTimer("Traitement complet passe n°" + numPass);

			int numSousGroupe=1;
			for (TraitementSousGroupe trt : vTrt) {
				if (bStopCalcul) break;
				traiteSousGroupe(trt, numSousGroupe);
				numSousGroupe++;
			}

			UtilsTime.stopTimer("Traitement complet passe n°" + numPass);
			Logger.log_INFO1(UtilsTime.getStringDuree("Traitement complet passe n°" + numPass));

			JTextField   tf = numPass==1 ? tf_dureeRestante_pass1 : tf_dureeRestante_pass2;
			JProgressBar pb = numPass==1 ? pb_TraitementComplet_pass1 : pb_TraitementComplet_pass2;
			if (!bStopCalcul) pb.setValue(100); // si calcul stoppé par user, on laisse le % courant
			tf.setText("");

			// Fin de traitement :
			// si en passe 1, on lance la passe 2
			// sinon, on s'arrete en nettoyant l'affichage
			if (numPass==1 && params.bMake2Pass) {

				// Calcul de la vitesse de traitement
				// utile pour que la DLG de la passe 2 puisse indiquer la duree estimée du traitement selon les paramètres
				long currentTime = System.currentTimeMillis();
				double nbSecondeEcoulee = ((double)currentTime - timeDeb)/1000;
				vitesse = nbCalculsElementairesTotal_pondere / nbSecondeEcoulee;

				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						startPass2();
					}
				});
			} else {
				finalizeTraitement();
			}

			} catch (OutOfMemoryError err) {
				Logger.log_ERROR("Pas assez de mémoire pour le traitement !");

				// on tente de libérer un peu de mémoire, pour que la dlg d'avertissement s'affiche sans trop de mal ...
				if (data.algo.currentTrt != null)
					data.algo.currentTrt.dispose();
				System.gc();

				String msg = "L'application n'a pas suffisamment de mémoire pour réaliser le traitement demandé.\n" +
						"Il faut redémarrer l'application et changer des paramètres.\n" +
						"Voici quelques pistes pour résoudre le problème :\n" +
						" a) augmenter la taille mémoire utilisable par l'application (dans le fichier INI : paramètres -Xms et -Xmx) -> cette valeur dépend du système (RAM, etc.)\n" +
						" b) diminuer la taille du vivier pour la 1ère passe (la 2ème passe permet, elle, d'utiliser des viviers plus importants sans souci)\n" +
						" c) utiliser l'option \"sous-découpage du problème\"\n" +
						" d) trouver des paramètres permettant de mieux sous-découper le problème, par ex :\n" +
						"     - diminuer la distance max entre une annotation et son poste\n" +
						"     - réduire les espaces de protection autour des annotations\n" +
						"     - diminuer la taille des annotations\n" +
						"     - décocher l'option \"multiligne\"";

				JOptionPane.showMessageDialog(rootPane, msg, "Erreur durant le traitement", JOptionPane.ERROR_MESSAGE);

				finalizeTraitement();
			}
		}


		private void traiteSousGroupe (TraitementSousGroupe trt, int numSousGroupe) {
			dlg_DetailTraitement.initDisplay(trt);

			data.algo.startTraitementSousGroupe(trt);
			for (int i=0 ; i<trt.nbIter ; i++) {
				if (bStopCalcul) break;
				data.algo.step();

				nbCalculsElementairesRealise += trt.getNbCalculsElementaires_Total_pondere()/trt.nbIter;
				updateDisplay(trt, numSousGroupe, vTrt.size(), true);
			}
			updateDisplay(trt, numSousGroupe, vTrt.size(), false);
			data.algo.finTraitementSousGroupe();
		}


		// Attention, on n'est pas dans l'EDT, mais tant pis ...
		long timeLastUpdateStat = 0;
		long timeLastUpdateDuree = 0;
		private void updateDisplay(TraitementSousGroupe trt, int numSousGroupe, int nbTotalSousGroupe, boolean bLight) {
			long currentTime = System.currentTimeMillis();

			// Statistiques et avancement de l'algorithme : 20 fois par seconde
			if (!bLight || currentTime >= timeLastUpdateStat+50) {
				timeLastUpdateStat = currentTime;

				// infos de la passe en cours
				JTextField tf = numPass==1 ? tf_Note_pass1 : tf_Note_pass2;
				JProgressBar pb = numPass==1 ? pb_TraitementComplet_pass1 : pb_TraitementComplet_pass2;
				tf.setText(""+data.algo.bestNoteGlobaleCourante);
				tf_noteGlobale.setText(""+data.algo.bestNoteGlobaleCourante);
				pb.setValue((int)UtilsCalcul.round(nbCalculsElementairesRealise / nbCalculsElementairesTotal_pondere * 100,0));
				pb.setString("" + numSousGroupe + " / " + nbTotalSousGroupe);

				// infos du traitement en cours
				dlg_DetailTraitement.updateDisplay(trt);
			}

			// Durée de traitement : toutes les 5 secondes, car sinon, l'imprecision de l'estimation fait changer la valeur sans arret ...
			JTextField tf = numPass==1 ? tf_dureeRestante_pass1 : tf_dureeRestante_pass2;
			if (currentTime - timeDeb < 10000) {
				// si inf a 10 sec de traitement, on n'affiche pas la duree de traitement, car trop imprecise
				tf.setText("en cours d'estimation ...");
			} else if (!bLight || currentTime >= timeLastUpdateDuree+500) {
				timeLastUpdateDuree = currentTime;
				// Durée de traitement
				double nbSecondeEcoulee = ((double)currentTime - timeDeb)/1000;
				double dureeTotale_s = nbSecondeEcoulee / nbCalculsElementairesRealise * nbCalculsElementairesTotal_pondere;
				double dureeRestante_s = dureeTotale_s - nbSecondeEcoulee;

				int dureeRestante_mn = (int)(dureeRestante_s/60) + 1;
				tf.setText("environ " + dureeRestante_mn + " mn");// -> " + UtilsCalcul.round(dureeRestante_s,0) + "/" + UtilsCalcul.round(dureeTotale_s,0));
			}
		}
	}


    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        button_Exit = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        label_dureeRestante_pass1 = new javax.swing.JLabel();
        tf_dureeRestante_pass1 = new javax.swing.JTextField();
        label_Nom_pass1 = new javax.swing.JLabel();
        pb_TraitementComplet_pass1 = new javax.swing.JProgressBar();
        label_Note_pass1 = new javax.swing.JLabel();
        tf_Note_pass1 = new javax.swing.JTextField();
        label_Nom_pass2 = new javax.swing.JLabel();
        pb_TraitementComplet_pass2 = new javax.swing.JProgressBar();
        label_Note_pass2 = new javax.swing.JLabel();
        tf_Note_pass2 = new javax.swing.JTextField();
        label_dureeRestante_pass2 = new javax.swing.JLabel();
        tf_dureeRestante_pass2 = new javax.swing.JTextField();
        jLabel19 = new javax.swing.JLabel();
        tf_noteGlobale = new javax.swing.JTextField();
        toggle_ShowDetails = new javax.swing.JToggleButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
        setTitle("Traitement placement des annotations");
        setResizable(false);
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentMoved(java.awt.event.ComponentEvent evt) {
                formComponentMoved(evt);
            }
        });

        button_Exit.setFont(new java.awt.Font("Tahoma", 1, 11));
        button_Exit.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/icons/croix_16.png"))); // NOI18N
        button_Exit.setText("Stopper le calcul");
        button_Exit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                button_ExitActionPerformed(evt);
            }
        });

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Informations Générales", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Trebuchet MS", 1, 11))); // NOI18N

        label_dureeRestante_pass1.setText("Durée de traitement restante :");

        tf_dureeRestante_pass1.setEditable(false);
        tf_dureeRestante_pass1.setText("...");
        tf_dureeRestante_pass1.setBorder(null);

        label_Nom_pass1.setFont(new java.awt.Font("Trebuchet MS", 1, 11));
        label_Nom_pass1.setText("1ère PASSE");

        pb_TraitementComplet_pass1.setFont(new java.awt.Font("Tahoma", 1, 11));
        pb_TraitementComplet_pass1.setRequestFocusEnabled(false);
        pb_TraitementComplet_pass1.setString(" ");
        pb_TraitementComplet_pass1.setStringPainted(true);

        label_Note_pass1.setFont(new java.awt.Font("Trebuchet MS", 0, 11));
        label_Note_pass1.setText("=> Note :");

        tf_Note_pass1.setEditable(false);
        tf_Note_pass1.setFont(new java.awt.Font("Trebuchet MS", 1, 11));
        tf_Note_pass1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        label_Nom_pass2.setFont(new java.awt.Font("Trebuchet MS", 1, 11)); // NOI18N
        label_Nom_pass2.setText("2ème PASSE");
        label_Nom_pass2.setEnabled(false);

        pb_TraitementComplet_pass2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        pb_TraitementComplet_pass2.setEnabled(false);
        pb_TraitementComplet_pass2.setRequestFocusEnabled(false);
        pb_TraitementComplet_pass2.setString(" ");
        pb_TraitementComplet_pass2.setStringPainted(true);

        label_Note_pass2.setFont(new java.awt.Font("Trebuchet MS", 0, 11)); // NOI18N
        label_Note_pass2.setText("=> Note :");
        label_Note_pass2.setEnabled(false);

        tf_Note_pass2.setEditable(false);
        tf_Note_pass2.setFont(new java.awt.Font("Trebuchet MS", 1, 11));
        tf_Note_pass2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(153, 153, 153)));
        tf_Note_pass2.setEnabled(false);

        label_dureeRestante_pass2.setText("Durée de traitement restante :");
        label_dureeRestante_pass2.setEnabled(false);

        tf_dureeRestante_pass2.setEditable(false);
        tf_dureeRestante_pass2.setText("...");
        tf_dureeRestante_pass2.setBorder(null);
        tf_dureeRestante_pass2.setEnabled(false);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(label_Nom_pass1)
                    .addComponent(label_Nom_pass2))
                .addGap(34, 34, 34)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(pb_TraitementComplet_pass2, 0, 0, Short.MAX_VALUE)
                    .addComponent(pb_TraitementComplet_pass1, javax.swing.GroupLayout.DEFAULT_SIZE, 135, Short.MAX_VALUE))
                .addGap(18, 18, 18)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(label_Note_pass1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tf_Note_pass1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(label_Note_pass2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tf_Note_pass2)))
                .addGap(30, 30, 30)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(label_dureeRestante_pass2)
                    .addComponent(label_dureeRestante_pass1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tf_dureeRestante_pass2, javax.swing.GroupLayout.DEFAULT_SIZE, 137, Short.MAX_VALUE)
                    .addComponent(tf_dureeRestante_pass1, javax.swing.GroupLayout.DEFAULT_SIZE, 137, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(label_Nom_pass1)
                            .addComponent(pb_TraitementComplet_pass1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(pb_TraitementComplet_pass2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label_Nom_pass2)))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGap(25, 25, 25)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(label_Note_pass2)
                            .addComponent(tf_Note_pass2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(label_dureeRestante_pass2)
                            .addComponent(tf_dureeRestante_pass2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(label_Note_pass1)
                        .addComponent(tf_Note_pass1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(label_dureeRestante_pass1)
                        .addComponent(tf_dureeRestante_pass1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jLabel19.setFont(new java.awt.Font("Trebuchet MS", 1, 11));
        jLabel19.setText("=> Note globale :");

        tf_noteGlobale.setEditable(false);
        tf_noteGlobale.setFont(new java.awt.Font("Trebuchet MS", 1, 11));
        tf_noteGlobale.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        toggle_ShowDetails.setText("Afficher détails traitement");
        toggle_ShowDetails.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                toggle_ShowDetailsActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(button_Exit)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel19)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tf_noteGlobale, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(toggle_ShowDetails))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(toggle_ShowDetails)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(button_Exit)
                    .addComponent(jLabel19)
                    .addComponent(tf_noteGlobale, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(12, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

	private void button_ExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_button_ExitActionPerformed
		//le calcul est déjà terminé, le bouton sert alors à fermer la fenêtre
		if (bStopCalcul) {
			dlg_DetailTraitement.setVisible(false);
			dlg_DetailTraitement.dispose();
			setVisible(false);
			dispose();
			return;
		}

		//ici, on est en cours de calcul
		int ret = JOptionPane.showConfirmDialog(this, "Etes vous sûr de vouloir stopper le traitement ?", "Arrêt du traitement", JOptionPane.OK_CANCEL_OPTION);
		if (ret==JOptionPane.CLOSED_OPTION || ret==JOptionPane.CANCEL_OPTION)
			return;
		bStopCalcul = true;
	}//GEN-LAST:event_button_ExitActionPerformed

	private void toggle_ShowDetailsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_toggle_ShowDetailsActionPerformed
		if (toggle_ShowDetails.isSelected()) {
			toggle_ShowDetails.setText("Masquer détails traitement");
			dlg_DetailTraitement.setVisible(true);
		} else {
			toggle_ShowDetails.setText("Afficher détails traitement");
			dlg_DetailTraitement.setVisible(false);
		}
	}//GEN-LAST:event_toggle_ShowDetailsActionPerformed

	private void formComponentMoved(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentMoved
		// on replace la dlg de detail bien en dessous de this
		adjustPositionOfDlgDetail();
	}//GEN-LAST:event_formComponentMoved



    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton button_Exit;
    private javax.swing.JLabel jLabel19;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JLabel label_Nom_pass1;
    private javax.swing.JLabel label_Nom_pass2;
    private javax.swing.JLabel label_Note_pass1;
    private javax.swing.JLabel label_Note_pass2;
    private javax.swing.JLabel label_dureeRestante_pass1;
    private javax.swing.JLabel label_dureeRestante_pass2;
    private javax.swing.JProgressBar pb_TraitementComplet_pass1;
    private javax.swing.JProgressBar pb_TraitementComplet_pass2;
    private javax.swing.JTextField tf_Note_pass1;
    private javax.swing.JTextField tf_Note_pass2;
    private javax.swing.JTextField tf_dureeRestante_pass1;
    private javax.swing.JTextField tf_dureeRestante_pass2;
    private javax.swing.JTextField tf_noteGlobale;
    private javax.swing.JToggleButton toggle_ShowDetails;
    // End of variables declaration//GEN-END:variables


}

